package test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest extends Father{
    private int a;
    public String b;
    public float c;

    public ReflectTest(){}
    public ReflectTest(String b){
        this.b=b;
    }
    public ReflectTest(int a){
        this.a=a;
    }
    private  ReflectTest(float c){
        this.c=c;
    }
//    public void addfa(int fa){
//        super.addfa(fa);
//    }

    private void addb(String extend){
        b=b+extend;
    }

    public static void main(String[] arg) throws Exception{

        //获取类clazz
        Class clazz=Class.forName("test.ReflectTest");
        clazz=ReflectTest.class;

        //构造方法的使用
        Constructor c1=clazz.getConstructor(String.class);
        ReflectTest r1=(ReflectTest)c1.newInstance("haha");
        Constructor c2=clazz.getDeclaredConstructor(float.class);
        ReflectTest r2=(ReflectTest)c2.newInstance((float)1.2);
//        System.out.println(r2.c);
        //获取所有构造方法
        Constructor[] cs1=clazz.getConstructors();
        cs1=clazz.getDeclaredConstructors();
//        for(Constructor i:cs1)
//            System.out.println(i);

        //获取所有方法
        Method[] ms1=clazz.getDeclaredMethods();    //只获得当前类的所有方法
//        ms1=clazz.getMethods();         //会获得父类和接口的public方法
        for(Method i:ms1)
            System.out.println(i);
        //方法的使用
//        m1=clazz.getMethod("addb",String.class);
        Method m1=clazz.getDeclaredMethod("addb",String.class);    //私有方法的获取
        m1=clazz.getDeclaredMethod("addfa",int.class);
        m1.invoke(r2,9);         //私有方法的使用
//        System.out.println(r2.c);

        //获取所有字段
        Field[] fs1=clazz.getDeclaredFields();
        for(Field i:fs1)
            System.out.println(i);
    }



}

class Father{
    public int fa;
    public Father(){}
    public Father(int fa){
        this.fa=fa;
    }
    public void addfa(int fa){
        this.fa+=fa;
    }

}
